package com.zp.self.module.level_4_算法练习.数学.位运算;

/**
 * @author By ZengPeng
 */
public class 力扣_693_交替位二进制数 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_693_交替位二进制数().hasAlternatingBits(5));
        System.out.println(new 力扣_693_交替位二进制数().hasAlternatingBits(7));
        System.out.println(new 力扣_693_交替位二进制数().hasAlternatingBits(11));
        System.out.println(new 力扣_693_交替位二进制数().hasAlternatingBits(4));
    }

    /**
    题目：给定一个正整数，检查它的二进制表示是否总是 0、1 交替出现：换句话说，就是二进制表示中相邻两位的数字永不相同。

     示例 1：
     输入：n = 5
     输出：true
     解释：5 的二进制表示是：101

     示例 2：
     输入：n = 7
     输出：false
     解释：7 的二进制表示是：111.

     示例 3：
     输入：n = 11
     输出：false
     解释：11 的二进制表示是：1011.

    分析：【P 💜💜】
       1.不断&1 得到最后一位，添加标记位falg，是否出现连续两次同位
            --执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户
       大佬位运算：两次位运算

    边界值 & 注意点：
       1.
     **/
    public boolean hasAlternatingBits(int n) {
        // 如 010101 右移一位得到 001010
        // 二者异或之后得到011111  (这一步是关键,只有交替出现01，异或后才能得到结果0111111...11)
        // 为了判断 异或后的结果是否满足(0111111...11)类型的结果
        // 可以用如下方法，比如
        // 011111 加上1 为100000
        // 011111 与 100000按位相与 结果为000000 ， 也就是0;
        int m = n ^ (n >> 1);
        return (m & (m + 1)) == 0;

        // 1.不断&1 得到最后一位，添加标记位falg，是否出现连续两次同位
       /* boolean flag=(n&1)==1;
        while (n>0){
            if((n&1)==1){  //当前位=1
                if(flag)
                    flag=false;
                else
                    return false;
            }else {
                if(!flag)
                    flag=true;
                else
                    return false;
            }
            n=n>>1;
        }
        return true;*/
    }
}
